UDP Socket接收缓冲区与netstat Recv 您所在的位置:网站首页 openwrt 设置网卡缓冲区 UDP Socket接收缓冲区与netstat Recv

UDP Socket接收缓冲区与netstat Recv

2023-07-15 23:54| 来源: 网络整理| 查看: 265

UDP Socket接收缓冲区与netstat Recv-Q

我们通常使用netstat查看网络的诸多状态,其中包含Send-Q与Recv-Q。

我们知道:

每一个Socket对象在系统中都被映射为一个Socket文件; 每一个Socket对象在系统中都关联有两个内核缓冲区:一个接收缓冲区(读缓冲区),一个发送缓冲区(写缓冲区);

Send-Q:指代的是内核中Socket对应的发送缓冲区尚未发送完毕的字节数; Recv-Q:指代的是内核中Socket对应的接收缓冲区尚未被用户收走(read)而滞留在接收缓冲区的字节数;

下面请看示例:

#include #include #include #include #include #include #include #include #include #include static int totalMsg = 0; void sigINT(int dwsigno) { printf("totalMsg: %d\n", totalMsg); exit(0); } int openServer() { struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_PASSIVE; hints.ai_socktype = SOCK_DGRAM; struct addrinfo *res; static char *port = "4020"; int e = getaddrinfo(NULL, port, &hints, &res); if (e == EAI_SYSTEM) { printf("openServer: getaddrinfo error=%d(%s)!!!\n", errno, strerror(errno)); return -1; } else if (e != 0) { printf("openServer: getaddrinfo error=%s!!!\n", gai_strerror(e)); return -1; } int fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (fd < 0) { printf("openServer: create socket error=%d(%s)!!!\n", errno, strerror(errno)); freeaddrinfo(res); return -1; } int rcvBufSize = 131071; // 系统默认可设置缓冲区大小 socklen_t optlen = sizeof(rcvBufSize); if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &rcvBufSize, optlen) < 0) { printf("openServer: setsockopt error=%d(%s)!!!\n", errno, strerror(errno)); freeaddrinfo(res); return -1; } int rcvRealSize = -1; if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &rcvRealSize, &optlen) < 0) { printf("openServer: getsockopt error=%d(%s)!!!\n", errno, strerror(errno)); freeaddrinfo(res); return -1; } printf("recrive-buff-size: %d\n", rcvRealSize); if (bind(fd, (struct sockaddr *)res->ai_addr, res->ai_addrlen) < 0) { printf("openServer: bind error=%d(%s)!!!\n", errno, strerror(errno)); freeaddrinfo(res); return -1; } printf("create udp socket(%d) ok!\n", fd); return fd; } void monUdpSock(int udpSock) { static fd_set fds; FD_ZERO(&fds); FD_SET(udpSock, &fds); static struct timeval tv = {0, 20000}; int readyNum = select(udpSock+1, &fds, NULL, NULL, &tv); if (readyNum < 0) { printf("monUdpSock: select error=%d(%s)!!!\n", errno, strerror(errno)); // 异常处理 return; } else if (readyNum == 0) return; // select超时,do nothing else ; // 存在可读写fd if (!FD_ISSET(udpSock, &fds)) return; static char udpMsg[1024*64]; // 64KB int rbytes = read(udpSock, udpMsg, sizeof(udpMsg)); if (rbytes


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有